package com.ruoyi.system.service.impl;

import cn.hutool.core.img.Img;
import cn.hutool.core.io.FileUtil;
import com.ruoyi.common.config.RuoYiConfig;
import com.ruoyi.common.core.text.Convert;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.system.domain.CarFile;
import com.ruoyi.system.mapper.CarFileMapper;
import com.ruoyi.system.service.ICarFileService;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.math.NumberUtils;
import org.springframework.scheduling.annotation.Async;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.io.File;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.Arrays;
import java.util.List;
import java.util.Objects;
import java.util.stream.Collectors;

/**
 * 车辆文件Service业务层处理
 *
 * @author ruoyi
 * @date 2022-03-13
 */
@Slf4j
@Service("file")
public class CarFileServiceImpl implements ICarFileService {
    @Resource
    private CarFileMapper carFileMapper;

    /**
     * 查询车辆文件
     *
     * @param fileId 车辆文件主键
     * @return 车辆文件
     */
    @Override
    public CarFile selectCarFileByFileId(Long fileId) {
        return carFileMapper.selectCarFileByFileId(fileId);
    }

    /**
     * 查询车辆文件列表
     *
     * @param carFile 车辆文件
     * @return 车辆文件
     */
    @Override
    public List<CarFile> selectCarFileList(CarFile carFile) {
        return carFileMapper.selectCarFileList(carFile);
    }

    /**
     * 新增车辆文件
     *
     * @param carFile 车辆文件
     * @return 结果
     */
    @Override
    public int insertCarFile(CarFile carFile) {
        carFile.setCreateTime(DateUtils.getNowDate());
        return carFileMapper.insertCarFile(carFile);
    }

    /**
     * 修改车辆文件
     *
     * @param carFile 车辆文件
     * @return 结果
     */
    @Override
    public int updateCarFile(CarFile carFile) {
        carFile.setUpdateTime(DateUtils.getNowDate());
        return carFileMapper.updateCarFile(carFile);
    }

    /**
     * 批量删除车辆文件
     *
     * @param fileIds 需要删除的车辆文件主键
     * @return 结果
     */
    @Override
    public int deleteCarFileByFileIds(String fileIds) {
        String[] ids = Convert.toStrArray(fileIds);
        List<CarFile> fileList = Arrays.stream(ids).map(id -> selectCarFileByFileId(NumberUtils.toLong(id, -1))).filter(Objects::nonNull).collect(Collectors.toList());
        int i = carFileMapper.deleteCarFileByFileIds(ids);
        if (i > 0) {
            for (CarFile carFile : fileList) {
                String path = RuoYiConfig.getProfile() + carFile.getFileUrl();
                Path path1 = Paths.get(path);
                try {
                    Files.deleteIfExists(path1);
                } catch (Exception e) {
                    log.error("物理删除文件异常：{} -{}", path, e.getMessage(), e);
                }
                try {
                    File file = path1.getParent().toFile();
                    if (ArrayUtils.isEmpty(file.list())) {
                        Files.deleteIfExists(file.toPath());
                    }
                } catch (Exception e) {
                    log.error("文件夹删除异常：{} {}", path, e.getMessage(), e);
                }
            }
        }
        return i;
    }

    /**
     * 删除车辆文件信息
     *
     * @param fileId 车辆文件主键
     * @return 结果
     */
    @Override
    public int deleteCarFileByFileId(Long fileId) {
        return carFileMapper.deleteCarFileByFileId(fileId);
    }

    @Override
    public List<CarFile> queryByType(Long carId, String busType, String fileType) {
        CarFile carFile = new CarFile();
        carFile.setBusId(carId);
        carFile.setBusType(busType);
        carFile.setFileType(fileType);
        return selectCarFileList(carFile);
    }

    public List<CarFile> queryByGroupType(Long carId, String busType, String groupType) {
        CarFile carFile = new CarFile();
        carFile.setBusId(carId);
        carFile.setBusType(busType);
        carFile.setGroupType(groupType);
        return carFileMapper.selectByBusinessTypeList(carFile);
    }

    @Async
    @Override
    public void yasuo(String filePath) {
        try {
            log.debug("压缩图片：{}", filePath);
            Img.from(FileUtil.file(filePath)).setQuality(0.65)//压缩质量
//                    .scale(0.55F)//等比例缩放
                    .write(FileUtil.file(filePath));
        } catch (Exception e) {
            log.error("图片压缩异常：{}-{}", filePath, e.getMessage(), e);
        }
    }

    @Override
    public List<CarFile> getFiles(Long carId, String busType, String groupType) {
        //        String url = serverConfig.getUrl();
        String url = RuoYiConfig.getPreFileUrl();
        List<CarFile> carFiles = queryByGroupType(carId, busType, groupType);
        for (CarFile carFile : carFiles) {
            carFile.setFileUrl(url + carFile.getFileUrl());
        }
        return carFiles;
    }
}
